# -*- coding: utf-8 -*-

"""Un simple backend para nuestra aplicacion TODO, usando Elixir"""

import os, datetime
from elixir import *

dbdir=os.path.dirname(__file__)
dbfile=os.path.join(dbdir,"db.sqlite")

class Articulo(Entity):

    using_options(tablename='articulo')

    nombre = Field(Unicode(200),required=True)
    precio = Field(Integer,required=True)
    stock = Field(Integer,required=True)
    ventas = OneToMany('DetalleVenta')

    def __repr__(self):
        return "Articulo: %s" % self.nombre

class Vendedor(Entity):

    using_options(tablename='vendedor')

    nombre = Field(Unicode(200),required=True)
    apellido_paterno = Field(Unicode(200),required=True)
    apellido_materno = Field(Unicode(200),required=True)
    usuario = Field(Unicode(200),required=True)
    password = Field(Unicode(200),required=True)
    ventas = OneToMany('Venta')

    def __repr__(self):
        return "%s" % self.usuario

class Venta(Entity):

    using_options(tablename='venta')

    fecha = Field(DateTime,default=datetime.datetime.now,required=False)
    forma_pago = Field(Unicode(200),required=True)
    pago = Field(Integer,required=True)
    total = Field(Integer,required=True)
    vendedor = ManyToOne("Vendedor")
    vuelto = Field(Integer,required=True)
    nula = Field(Boolean, required=True, default=False)
    detalles = OneToMany('DetalleVenta')

    def __repr__(self):
        return "Venta: %s" % self.fecha

class DetalleVenta(Entity):

    using_options(tablename='detalle_venta')

    articulo = ManyToOne("Articulo")
    cantidad = Field(Integer,required=True)
    precio = Field(Integer,required=True)
    venta = ManyToOne("Venta")
    subtotal = Field(Integer,required=True)

    def __repr__(self):
        return "Detalle Venta: %i" % self.id

class Devolucion(Entity):

    using_options(tablename='devolucion')

    articulo = ManyToOne("Articulo")
    cantidad = Field(Integer,required=True)
    precio = Field(Integer,required=True)
    venta = ManyToOne("Venta")
    vendedor = ManyToOne("Vendedor")

    def __repr__(self):
        return "Devolucion: %i" % self.id

saveData=None

# Usar una DB involucra algunas tareas, las pondré en la
# función initDB. Recordá llamarlo antes de intentar usar
# Tareas o Etiquetas!

def initDB():
    # Acomodar cosas internas de Elixir

    metadata.bind = "sqlite:///%s"%dbfile

    # Datos conexion MySQL
    # usuario = "root"
    # password = "zuvngqtf"
    # server = "localhost"
    # data_base = "indigo"
    # metadata.bind = "mysql://%s:%s@%s/%s" % (usuario, password, server, data_base)
    
    setup_all()
    # create_all()

    # Si la base no existe, crearla.

    if not os.path.exists(dbfile):
        create_all()

    # This is so Elixir 0.5.x and 0.6.x work
    # Yes, it's kinda ugly, but needed for Debian 
    # and Ubuntu and other distros.

    global saveData
    import elixir
    
    if elixir.__version__ < "0.6":
        saveData=session.flush
    else:
        saveData=session.commit

# Normalmente agrego a todos los modulos una función main()
# que haga algo útil, como correr unit tests. En este
# caso, demuestra la funcionalidad de nuestro backend.
# Podés probarlo ejecutandolo asi::
#
#   python todo.py

# Sin comentario detallados para esto: Estudialo por tu cuenta
# no es complicado!

def main():

    # Inicializar la DB
    initDB()

    # Crear 3 articulos
    articulos = Articulo.query.all()
    if len(articulos) == 0:
        camisa = Articulo(nombre=u"camisa", precio=10000, stock=10)
        pantalon = Articulo(nombre=u"pantalon", precio=15000, stock=15)
        casaca = Articulo(nombre=u"casaca", precio=20000, stock=20)
        session.commit()

    # Crear 1 vendedor
    vendedores = Vendedor.query.all()
    if len(vendedores) == 0:
        vendedor1 = Vendedor(nombre=u"Leonardo", apellido_paterno=u"Gatica", apellido_materno=u"Quezada", usuario=u"lgatica", password=u"1234")
        session.commit()

if __name__ == "__main__":
    main()
